package main

import (
	"fmt"
	"math"
)

/*
	感觉就是在一个特征群里面某些特征能够相邻的组合在一起形成新的特征
	然后找这个新特征在这个特征群里面的位置
	前提是，这个特征群是有一般规律的
*/

//给你一个整数 n ，
//请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...]
//中找出并返回第 n 位上的数字。
//输入：n = 11
//输出：0
//解释：第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是 0 ，它是 10 的一部分。

func main() {
	// d 表示位数，比如两位数19，三位数123，四位数3456这样的
	// n 就是题目给的
	d, n := 1, 1778
	// 看下面的规律
	// 1位数的所有数字位数之和为 1*9=9，这个9是指从1到9的数字的总个数
	// 2位数的所有数字位数之和为 2*90=180，这个90 是指从10到99的数字的总个数
	// 3位数的所有数字位数之和为 3*900=2700，这个900 是指从100到999的数字的总个数
	// 所以得出结论n位数的所有数字位数之和为 n*9*10^(n-1)
	// 所以思路为题目给出n位数，我们依次减去1、2、3、···位数的数字总个数，看n是否小于2、3、···位数的数字
	// 总个数
	// 即 n = n - d * count < (d + 1) * (count * 10) ?
	// 表明不够减了，即n位数所在位置的位数为d位数 : n还可以减，即有可能位于d+1位数，我们继续减
	for count := 9; n > d*count; count *= 10 {
		n -= d * count
		d++
	}
	// 这里运算完了，我们得到以下信息：
	// 题目给的n位数位于d位数字之中 eg： 18 位于2位数字之中 【10,99】，明白了吧？
	index := n - 1 // 下标从0开始方便计算
	// 此时的n已经减去了d-1位数的所有数字总个数，还剩下n个位数，这n个位数就在区间[10^(d-1),10^d-1]上
	start := int(math.Pow10(d - 1))
	// 已知从10^(d-1)开始，还有n个位数，每d个位数组成一个数字 eg：从 10开始 还有7个位数，每2个位数组成一个数字
	// 那么有7 / 2 = 3个数字也就是 10,11,12，那么后面的13就是题目中n位数所位于的数字
	num := start + index/d //这个num就是题目中n位数所位于的数字
	// 知道了具体的数字，剩下的就是看在这个数字中的具体位置，即 7 % 2 = 1，哦，最终的结果就位于
	// num这个数的往后1位 即13的 3，假如题目给的n是17哈。。。
	digitIndex := index % d
	// 那么怎么把这个数字取出来呢，下面这个结果就是了，主要思路就是想办法让目标位作为个位，然后取10的余数
	// num数字 去 除以 10的d - 1 - digitIndex次方的结果 模10
	// eg ：13 / 10 ^(2-1-1) % 10  10 ^(2-1-1)是指结果所在的是个位、十位、还是百分···
	// 作除运算是为了刚好把结果那一位给商出来，不然没办法取余数
	target := num / int(math.Pow10(d-1-digitIndex)) % 10
	fmt.Println(target)

}

// 58 59 60 61
